package com.itheima.ydd.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.ydd.entity.Menu;
import com.itheima.ydd.mapper.MenuMapper;
import com.itheima.ydd.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 菜单表 服务实现类
 * </p>
 *
 * @author yan.zhou
 * @since 2022-02-22
 */
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {

    @Autowired
    private MenuMapper menuMapper;

    @Override
    public List<Menu> menuList(String role_id) {
        String[] strings = role_id.split(",");
        List<Menu> menuList = menuMapper.findMenuList(strings);
        return menuList;
    }

    @Override
    public List<Menu> selectAll(Menu menu) {
        try {
            //查询出所有的菜单
            List<Menu> allMenu = this.list();

            //根节点存储
            List<Menu> rootMenu = new ArrayList<>();
            //根据传递的参数设置根节点
            if(menu != null && menu.getId()!= null){
                //父节点为传递的id为根节点
                for (Menu nav : allMenu) {
                    if(nav.getPid().equals(menu.getId())){
                        rootMenu.add(nav);
                    }
                }
            }else {
                //父节点是0的，为根节点
                for (Menu nav : allMenu) {
                    if(nav.getPid().equals(0)){
                        rootMenu.add(nav);
                    }
                }
            }

            //为根节点设置子菜单，getChild是递归调用
            for (Menu nv : rootMenu) {
                //获取根节点下的所有子节点，使用getChild方法
                List<Menu> childList = getChild(nv.getId(),allMenu);
                //给根节点设置子节点
                nv.setChildren(childList);
            }

            return rootMenu;
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

    private List<Menu> getChild(Integer id, List<Menu> allMenu) {
        //子菜单
        List<Menu> childList = new ArrayList<>();
        for (Menu nav : allMenu) {
            //遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
            //相等说明：为该根节点的子节点
            if(nav.getPid().equals(id)){
                childList.add(nav);
            }
        }
        //递归设置子节点
        for (Menu nav : childList) {
            nav.setChildren(getChild(nav.getId(),allMenu));
        }
        //如果节点下没有子节点，返回一个空List（递归退出）
        if(childList.size() == 0){
            return new ArrayList<Menu>();
        }
        return childList;
    }


}
